/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package br.com.janalise.model;

import br.com.janalise.util.BuscarPadrao;
import com.thoughtworks.xstream.annotations.XStreamOmitField;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.StringTokenizer;
import ptstemmer.Stemmer;
import ptstemmer.Stemmer.StemmerType;
import ptstemmer.exceptions.PTStemmerException;

/**
 *
 * @author boskyn9
 */
public class MapaDoTexto extends Model {
    
    private List<Regra> regras = new ArrayList<Regra>();
    private String conceito;
    private String path;
    private String nome;
    private String titulo;
    private String autor;
    private String definicoes;    
    
    @XStreamOmitField
    private String conteudo;
    @XStreamOmitField
    private Stemmer stemmer;

    public String getDefinicoes() {
        return definicoes;
    }

    public void setDefinicoes(String definicoes) {
        this.definicoes = definicoes;
    }

    public List<Regra> getRegras() {
        return regras;
    }

    public void setRegras(List<Regra> regras) {
        this.regras = regras;
    }

    public String getConteudo() {
        return conteudo;
    }

    public void setConteudo(String conteudo) {
        this.conteudo = conteudo;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getAutor() {
        return autor;
    }

    public void setAutor(String autor) {
        this.autor = autor;
    }

    public String getPath() {
        return path;
    }

    public void setPath(String path) {
        this.path = path;
    }

    public String getTitulo() {
        return titulo;
    }

    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }

    public String getConceito() {
        return conceito;
    }

    public void setConceito(String conceito) {
        this.conceito = conceito;
    }

    public void add(String chave) throws PTStemmerException{
        String semelhante = chave;
        stemmer = Stemmer.StemmerFactory(StemmerType.ORENGO);
        chave = stemmer.getWordStem(semelhante);

        String chaveExiste = pertence(semelhante);

        if(chaveExiste!=null)
            chave = chaveExiste;

        if(contains(chave)){
            incrementar(chave,semelhante);
        }else{
            Regra mapa = new Regra(chave, 0l);
            mapa.addOcorrencia(semelhante);
            regras.add(mapa);
        }
    }

    private boolean contains(String chave) throws PTStemmerException{
        if(chave!=null && !chave.isEmpty()){
            for (Regra mapaDoTexto : regras) {
                    if(chave.equalsIgnoreCase(mapaDoTexto.getChave()))
                       return true;
            }
            return false;
        }else
            return false;
    }

    private void incrementar(String chave, String semelhante) throws PTStemmerException{
         if(chave!=null && !chave.isEmpty()){
            for (Regra mapaDoTexto : regras) {
                    if(chave.equalsIgnoreCase(mapaDoTexto.getChave()))
                        mapaDoTexto.addOcorrencia(semelhante);
            }
        }
    }

    @Override
    public String toString(){
        StringBuffer toString = new StringBuffer();
        Collections.sort(regras);
        for (Regra mapaDoTexto : regras) {
            toString.append(mapaDoTexto.toString()+"\n");
        }
        return toString.toString();
    }

    private String pertence(String semelhante) {
       if(semelhante!=null && !semelhante.isEmpty()){
             StringTokenizer tokens = BuscarPadrao.sinonimos(semelhante);
             if(tokens!=null)
             for (Regra mapaDoTexto : regras) {
                 while (tokens.hasMoreTokens()) {
                     String str = stemmer.getWordStem(tokens.nextToken());
                    if(str.equalsIgnoreCase(mapaDoTexto.getChave())){
                        return str;
                     }
                 }
             }
       }
       return null;
    }
}
